package com.yndsoft.jc.netutils;

import com.yndsoft.jc.utils.LogUtils;

import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;

public class FileSizeUtils {
		public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
		public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
		public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
		public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
		/**
		* 获取文件指定文件的指定单位的大小
		* @param filePath 文件路径
		* @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
		* @return double值的大小
		*/
		public static double getFileOrFilesSize(String filePath, int sizeType){
			File file=new File(filePath);
			long blockSize=0;
			try {
				if(file.isDirectory()){
						blockSize = getFileSizes(file);
				}else{
						blockSize = getFileSize(file);
				}
			} catch (Exception e) {
				e.printStackTrace();
				LogUtils.e("获取文件大小,获取失败!");
			}
			return FormetFileSize(blockSize, sizeType);
		}
		/**
		* 调用此方法自动计算指定文件或指定文件夹的大小
		* @param filePath 文件路径
		* @return 计算好的带B、KB、MB、GB的字符串
		*/
		public static String getAutoFileOrFilesSize(String filePath){
			File file=new File(filePath);
			long blockSize=0;
			try {
				if(file.isDirectory()){
					blockSize = getFileSizes(file);
				}else{
					blockSize = getFileSize(file);
				}
			} catch (Exception e) {
				e.printStackTrace();
				LogUtils.e("获取文件大小,获取失败!");
			}
			return FormetFileSize(blockSize);
		}
		/**
		* 获取指定文件大小
		* @param
		* @return
		* @throws Exception
		*/
		private static long getFileSize(File file) throws Exception
		{
			long size = 0;
			FileInputStream fis = null;
			try{
				if (file.exists()){
					if("journal".equals(file.getName())){
						LogUtils.d("journal file appear.........");
						return size;
					}
					fis = new FileInputStream(file);
					size = fis.available();
				}
				else{
					file.createNewFile();
					LogUtils.e("获取文件大小,件不存在!");
				}
				 
			}catch(Exception ex){
				LogUtils.e(ex.toString());
			}finally{
				if(fis!=null){
					fis.close();
					fis=null;
				}
			}
			return size;
		}
		 
		/**
		* 获取指定文件夹
		* @param f
		* @return
		* @throws Exception
		*/
		private static long getFileSizes(File f) throws Exception
		{
			long size = 0;
			File flist[] = f.listFiles();
			for (int i = 0; i < flist.length; i++){
				if (flist[i].isDirectory()){
					size = size + getFileSizes(flist[i]);
				}else{
					size =size + getFileSize(flist[i]);
				}
			}
			return size;
		}
		/**
		 * 转换文件大小
		 * @param fileS
		 * @return
		 */
		private static String FormetFileSize(long fileS)
		{
			DecimalFormat df = new DecimalFormat("#0.00");
			String fileSizeString = "";
			String wrongSize="0KB";
			if(fileS==0){
				return wrongSize;
			}
			/*
			if (fileS < 1024){
				fileSizeString = df.format((double) fileS) + "B";
			}else 
			*/
			if (fileS < 1048576){
				fileSizeString = df.format((double) fileS / 1024) + "KB";
			}
			else if (fileS < 1073741824){
				fileSizeString = df.format((double) fileS / 1048576) + "MB";
			}else{
				fileSizeString = df.format((double) fileS / 1073741824) + "GB";
			}
		return fileSizeString;
		}
		/**
		 * 转换文件大小,指定转换的类型
		 * @param fileS 
		 * @param sizeType 
		 * @return
		 */
		private static double FormetFileSize(long fileS,int sizeType)
		{
			DecimalFormat df = new DecimalFormat("#.00");
			double fileSizeLong = 0;
			switch (sizeType) {
				case SIZETYPE_B:
					fileSizeLong= Double.valueOf(df.format((double) fileS));
					break;
				case SIZETYPE_KB:
					fileSizeLong= Double.valueOf(df.format((double) fileS / 1024));
					break;
				case SIZETYPE_MB:
					fileSizeLong= Double.valueOf(df.format((double) fileS / 1048576));
					break;
				case SIZETYPE_GB:
					fileSizeLong= Double.valueOf(df.format((double) fileS / 1073741824));
					break;
				default:
					break;
			}
			return fileSizeLong;
		}
}